package com.edu.boot301demo.bean;

import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.sql.Date;

/**
 * 雪花算法：由Twitter开发，使用41位时间戳+5位机器ID+5位序列号+12位随机数，生成全局唯一ID，
 * 它能保证不同表的主键的唯一性，以及相同表的主键的顺序性。
 * 核心思想：
 * - 长度：64位（Long类型）
 * - 首先是一个符号位，1bit标识，由于Long类型在Java中是带符号的，最高位为符号位，正数是0，负数是1，因为id一般是正数，最高位是0
 * - 41位时间戳（毫秒级）：存储的是时间戳的差值（当前时间戳-开始时间戳），结果约等于69年
 * - 10bit作为机器的ID，可以部署1024个节点。5bit作为数据序列号，同一节点同一毫秒只能生成1024个ID，5bit的机器ID可以配置为0-1023。
 * - 12bit作为毫秒内的流水号，用于解决ID碰撞问题。意味着一个毫秒内最多只能生成4096个ID。
 */
//@Entity
@Data

// 基于请求头内容协商（默认开启）
//@JacksonXmlRootElement // 可以写出为XML文件
@AllArgsConstructor
@NoArgsConstructor
@TableName("emps") // 设置实体类对应的表名
public class Employee implements Serializable {

    // value属性：设置主键字段
    // type属性：设置主键生成策略
    @TableId(value = "employee_id", type = IdType.AUTO)
    private Long employeeId;

    @TableField(value = "first_name")
    private String firstName;

    @TableField(value = "last_name")
    private String lastName;

    @TableField(value = "email")
    private String email;

    @TableField(value = "phone_number")
    private String phoneNumber;

    @TableField(value = "hire_date")
    private Date hireDate;

    @TableField(value = "job_id")
    private String jobId;

    @TableField(value = "salary")
    private double salary;

    @TableField(value = "commission_pct")
    private Double commissionPct;

    @TableField(value = "manager_id")
    private Integer managerId;

    @TableField(value = "department_id")
    private String departmentId;

    @TableField(value = "is_deleted")
    @TableLogic // 逻辑删除字段: 0: 未删除, 1: 已删除
    private Integer isDeleted;

    @TableField(exist = false)
    private Department department;

    @Version // 版本字段: 用于乐观锁
    @TableField(value = "version")
    private Integer version;

    @TableField(value = "gender")
    private Integer gender;

}
